[2]DaqoRTU配置说明

一、功能描述

DaqoRTU APP是通用型采集APP,目前主要支持MODBUS、DL645(07)规约。
主要特点如下:

  1. 通过sqlite3 db配置文件配置采集模型、采集档案;
  2. 根据配置文件自动生成数据中心测点模型、参数模型,以及ROMA平台物模型文件;
  3. 支持多种预配置测点类型解析,对于定制化解析需求的测点,可通过LUA脚本表达式进行扩展;
  4. 支持单线程、多线程运行模式,每个通道可扩展运行脚本文件。

二、使用说明

2.1 配置文件说明

主要配置文件:
config.db:APP组态配置文件,主要配置表如下:

  1. Basic,用于配置APP运行参数,例如MQTT BROKER地址,多线程运行模式等;
  2. Comm,用于配置通讯端口、协议及通讯参数
  3. Dev,用于配置设备列表,主要包括挂接的串口,模型,地址等信息

模型配置DB文件,例如RCD.db、RTU.db,主要配置表如下:

  1. Basic,用于配置设备基本信息,例如产品名称、厂家ID、厂家名、通讯协议、版本及描述等信息;
  2. PARAM,用于配置设备参数表,例如参数名称、描述、默认值、单位、类型、比例、偏置、解析类型、通讯解析相关参数信息等;
  3. YC, 用于配置设备遥测表,例如遥测名称、描述、默认值、单位、类型、比例、偏置、死区、是否上报、解析类型、通讯解析相关参数信息等;
  4. YX, 用于配置设备遥信表,例如遥信名称、描述、默认值、单位、类型、比例、偏置、死区、是否上报、解析类型、通讯解析相关参数信息等;

2.1 用户数据类型

USERTYPE 主要数据类型如下:  
NONE,       //无类型,不处理
UINT16BE,   //UINT16大端模式  
UINT16LE,   //UINT16小端模式  
UINT32BE,   //UINT32大端模式  
UINT32LE,   //UINT32小端模式  
UINT64BE,   //UINT64大端模式  
UINT64LE,   //UINT64小端模式   
INT16BE,    //INT16BE大端模式  
INT16LE,    //INT16BE小端模式  
INT32BE,    //INT32大端模式  
INT32LE,    //INT32小端模式  
INT64BE,    //INT64大端模式  
INT64LE,    //INT64小端模式  
FP32BE,     //float 大端模式  
FP32LE,     //float 小端模式  
FP64BE,     //double 大端模式  
FP64LE,     //double 小端模式  

BIT0,       //取第0位  
BIT1,      
BIT2,      
BIT3,      
BIT4,      
BIT5,      
BIT6,      
BIT7,      
BIT8,      
BIT9,      
BIT10,      
BIT11,      
BIT12,      
BIT13,      
BIT14,      
BIT15,         //取第15位  


LUA         //自定义脚本方式  

2.2 采集分组方法

APP采集支持分组、不同周期间隔进行采集功能,例如遥测、遥信以不同采集周期进行数据采集,方法如下:
TASKID: 采集任务分组ID号,对于LUA脚本测点类型,TASKID需要设置>=200
TASK_PERIOD: 采集任务周期(单位秒)

2.3 自定义脚本方法

当USERTYPE数值为LUA类型时,表示使用LUA脚本表达式对数据单元进行解析,脚本范例: return IGetYcValByTag("PhV_phsA")+IGetYcValByTag("PhV_phsB");

系统支持的自定义函数如下:

根据序号获取遥测
float IGetYcVal(int nId);  

根据序号获取遥信
int   IGetYxVal(int nId);  

根据测点TAG获取遥测
float IGetYcValByTag(const char* strTag);   

根据测点TAG获取遥信
int   IGetYxValByTag(const char* strTag);  

根据序号设置遥测
void  ISetYcVal(int nId, float fVal);

根据TAG设置遥测
void  ISetYcValByTag(const char* strTag, float nVal);

根据序号设置遥信
void  ISetYxVal(int nId, int nVal);

根据TAG设置遥信
void  ISetYxValByTag(const char* strTag, int nVal);

---------------------------------------------------

当前解析缓存获取uint8
unsigned char IGetUint8(int nOffset);

当前解析缓存获取int8
char IGetInt8(int nOffset);

当前解析缓存获取uint16大端
unsigned short IGetUint16BE(int nOffset);

当前解析缓存获取uint16小端
unsigned short IGetUint16LE(int nOffset);

当前解析缓存获取int16大端
short IGetInt16BE(int nOffset);

当前解析缓存获取int16小端
short IGetInt16LE(int nOffset);

当前解析缓存获取uint32大端
unsigned int IGetUint32BE(int nOffset);

当前解析缓存获取uint32小端
unsigned int IGetUint32LE(int nOffset);

当前解析缓存获取int32大端
int   IGetInt32BE(int nOffset);

当前解析缓存获取int32小端
int   IGetInt32LE(int nOffset);

当前解析缓存获取float大端
float IGetFloatBE(int nOffset);

当前解析缓存获取float小端
float IGetFloatLE(int nOffset);

当前解析缓存获取位数值
unsigned char  IGetBitValue(int nOffset, int nReadBitPos);

当前解析缓存获取uint64大端
unsigned long long IGetUint64BE(int nOffset);

当前解析缓存获取uint64小端
unsigned long long IGetUint64LE(int nOffset);

当前解析缓存获取int64大端
long long IGetInt64BE(int nOffset);

当前解析缓存获取int64小端
long long IGetInt64LE(int nOffset);

当前解析缓存获取double大端
double IGetDoubleBE(int nOffset);

当前解析缓存获取double小端
double IGetDoubleLE(int nOffset);

当前解析缓存获取位域数值
unsigned int IGetBitArea(int nOffset, int nStartBitPos, int nBitCount);

---------------------------------------------------
BCD数值转HEX
uint64 Bcd2Hex64(uint64 b64);

BCD数值转浮点
double  Bcd2F(uint64 value, uint8 dot);

2.4 虚拟遥测、遥信用法

TASKID配置200及以上时,表示虚拟测点,仅执行脚本表达式,用于计算虚遥测、遥信信息; 通讯中关于modbus功能码、起始地址、寄存器个数字段无效。

2.5 关于自定义处理脚本

该APP支持脚本回调函数功能,主要定义初始化、设备轮询、控制命令回调等预定义回调函数。
初始化回调函数(OnTaskInit)用于设置通讯句柄、控制命令参数等脚本用全局变量;
设备轮询任务回调函数(OnDevPoll)用于处理单台设备自定义召测任务,可对于特殊指令进行特殊召测处理;
控制命令回调函数(OnCommandRequest)用于处理设备控制消息,将标准控制命令进行格式转换,下发到装置进行处理;

例如:

-----------------------------------------------------
-- 全局变量
-----------------------------------------------------
local g_pMB      = nil;  -- 通讯控制句柄
local g_pCmdJob  = nil;  -- 当前正在处理的任务节点(OnCommandRequest回调函数使用)

-- 初始化任务
function OnTaskInit(nArgIndex, pArgData)
    
    if nArgIndex == 0 then
        g_pMB = pArgData;
    elseif nArgIndex == 1 then
        g_pCmdJob = pArgData;
    end
    
    return 1;
end


-- 单台设备自定义轮询任务
function OnDevPoll(nTickPass, pDevItem)
    
    --print("nTickPass = " .. nTickPass);
    --print("pDevItem = " .. tostring(pDevItem) );

    return 1;
end


-- 遥控命令回调函数
function OnCommandRequest()
    
    local    dev      = IGetCmdJob_Arg(g_pCmdJob, 0);   --设备实例
    local    name     = IGetCmdJob_Arg(g_pCmdJob, 1);   --命令名称
    local    cmd_type = IGetCmdJob_Arg(g_pCmdJob, 2);   --命令类型
    local    cmd      = tonumber(IGetCmdJob_Arg(g_pCmdJob, 3));   --命令
    local    action   = tonumber(IGetCmdJob_Arg(g_pCmdJob, 4));   --动作
    local    mode     = tonumber(IGetCmdJob_Arg(g_pCmdJob, 5));   --控制模式
    local    timeout  = tonumber(IGetCmdJob_Arg(g_pCmdJob, 6));   --超时时间
    local    devAddr  = tonumber(IGetCmdJob_Arg(g_pCmdJob, 10));  --装置地址
    
    local    reg_addr = 0x0000;
    local    reg_val  = 0x0000;
    local    nRet;
    
    print("dev = " .. dev);
    print("name = " .. name);
    print("cmd_type = " .. cmd_type);
    print("cmd = " .. cmd);
    print("action = " .. action);
    print("mode = " .. mode);
    print("timeout = " .. timeout);
    
    -- 控制对象匹配判断
    startIndex, endIndex = string.find(name, 'cmd_obj_');
    --print(startIndex);
    --print(endIndex);
    
    if startIndex >= 0 then
        strRegAddr = string.sub(name, endIndex+1);
        reg_addr = tonumber(strRegAddr, 16);
        --print(reg_addr);
    else 
        return 0; -- 不是可处理的控制命令
    end
    
    if cmd == 1 then
        reg_val  = 0xFF00;
    end
    
    -- 下发控制命令
    nRet = MBM_ForceSingleDigitOut(g_pMB, devAddr, reg_addr, reg_val);
    if nRet > 0 then
        print("MBM_ForceSingleDigitOut: addr=" .. devAddr .. " reg_addr=" .. reg_addr ..  " reg_val=" .. reg_val .. " OK.");
    else
        print("MBM_ForceSingleDigitOut: addr=" .. devAddr .. " reg_addr=" .. reg_addr ..  " reg_val=" .. reg_val .. " FAIL.");
    end

    return 1;
end
最后更新于 19th Nov 2021